package thread.interrupt;

/**
 * Created by zhj on 15-11-4.
 * 调用线程实例的isInterrupted() 方法不会清除中断标志
 * 但如果直接调用静态的Thread.interrupted()返回上一次中断标志的同时会清除线程的中断标志
 *
 *
 * threadA.interrupt()
 * 1.1 如果threadA正在运行，则threadA.interrupted返回true(一次性的)
 * 1.2 如果线程阻塞
 *  a 如果threadA阻塞wait sleep，线程收到一个中断异常InterruptedException，并清除中断标志
 *  b 如果1.4后的channel阻塞，线程收到一个ClosedByInterruptException，虽然异常不一样，但是处理逻辑一样
 *  c 如果使用传统io(java1.0),interrupt()方法线程不会收到异常进而退出阻塞状态，但可以通过调用套接字的close方法,导致阻塞线程SocketException，同样达到中止阻塞线程的目的
 *
 *
 *  综上：终止一个线程的通用做法是结合异常加共享变量的方式
 *  其实直接用threadA.interrupted就可以做这个事情，循环判断该标志，运行中的中断，可以通过状态位感知，阻塞中断则直接在异常捕获处，结束该线程即可
 *
 *
 */
public class Sample extends Thread{
    volatile boolean stop=false;//优雅的实现  是用这个共享变量  要终止的线程不间断的检测这个变量
    public static void main( String args[] ) throws Exception {
        Sample thread = new Sample();
        thread.start();
        Thread.sleep(3000);
        System.out.println("Interrupting thread...");

//        thread.stop=true;
        thread.interrupt();


        Thread.sleep( 3000);
        System.out.println("Stopping application..." );
        thread.interrupt();
        //System.exit(0);
    }



//    public void run() {
//        while(!stop){
//            System.out.println( "Thread is running..." +Thread.currentThread().isInterrupted());
//            long time = System.currentTimeMillis();
//            while((System.currentTimeMillis()-time < 1000)) {
//            }
//        }
//        System.out.println("Thread exiting under request..." );
//    }
//
//
//    public void run() {
//        while ( !stop ) {
//            System.out.println( "Thread running..." );
//            try {
//                Thread.sleep( 1000 );
//            } catch ( InterruptedException e ) {
//            // 对于中断异常的处理  可以直接抛出该上层，  如果不能抛出(如在run方法内),需调用Thread.currentThread().interrupt()保留线程的中断状态，
//                e.printStackTrace();
//                System.out.println( "Thread interrupted.........................." +Thread.interrupted());
//            }
//        }
//        System.out.println( "Thread exiting under request..." );
//    }
}
